<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- Template Design by TheWebhub.com | http://www.thewebhub.com | Released for free under a Creative Commons Attribution-Share Alike 3.0 Philippines -->

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>getToken(); - JavaScript-Based Hypothetical Programming Language Compiler</title>
  <meta name="keywords" content="javascript compilador web analise lexica sintatica semantica" />
  <meta name="description" content="" />
  <link href='images/favicon.ico' rel='icon' type='image/x-icon'/>
  <link href='images/favicon.ico' rel='shortcut icon' type='image/x-icon'/>
  <link href="style.css" rel="stylesheet" type="text/css" media="screen" />
  <script type="text/javascript" src="scripts/motion.js"></script>
</head>

<body>
    <div id="header">
        <h1>getToken();</h1>
    </div>
    <div id="menu">
        <ul>
		<li class="first"><a href="./">Home</a></li>
              <li><a href="download.html">Download</a></li>
              <li><a href="docs.html">Documentação</a></li>
              <li><a href="./source/" target="_blank">Source</a></li>
		<li><a href="sobre.html">Sobre</a></li>
        </ul>
    </div>
    <div id="page">
	<div id="page-top">

          <div class="adsense">
              <script type="text/javascript"><!--
                   google_ad_client = "pub-7710724268302172";
                   google_ad_slot = "3994626956";
                   google_ad_width = 728;
                   google_ad_height = 15;
                   //-->
              </script>
              <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
              </script>
           </div>

           <div id="page-bottom">
                <div>
			<div id="sidebar">
				<h2>Documentação</h2>
				<ul>
				   <li>
                                  Esta página contém informações sobre a elaboração e desenvolvimento
                                  deste projeto. Clique em um dos tópicos à direita para expandir mais
                                  informações a respeito de cada item ou veja os <a href="./docs/" target="_blank">relat&oacute;rios</a>
                                  da disciplina de <b>Construção de Compiladores II</b>.
                               </li>
				   <li>
                                  A última versão deste aplicativo e seu demo online estão disponíveis
                                  em <a href="http://go.crsouza.com/cc2">http://go.crsouza.com/cc2</a>.
                               </li>
				</ul>
			</div>
			<div id="content">
			    <h2><a href="javascript:;" onMouseDown="toggleSlide('content-objetivos');">
                             Objetivos
                         </a></h2>
                         <div id="content-objetivos" style="display: normal; overflow:hidden; height:330px;">
			    <p>
                            O objetivo deste trabalho é desenvolver um <a href="http://pt.wikipedia.org/wiki/Compilador">compilador-tradutor</a> de uma linguagem hipotética para
                            codigo em <a href="http://pt.wikipedia.org/wiki/C_(linguagem_de_programação)" target="_blank">linguagem C</a>, implementado inteiramente em Client-Side <a href="http://pt.wikipedia.org/wiki/Javascript" target="_blank">Javascript</a>. A tecnologia Javascript permite
                            que nosso compilador seja executado em qualquer plataforma, desde que para tal plataforma exista
                            um navegador web que ofereça suporte a esta linguagem.
                         </p>
                         <p>
                            A linguagem Javascript é particularmente interessante pois é uma <a href="http://en.wikipedia.org/wiki/Dynamic_programming_language" target="_blank">linguagem dinâmica</a>, e, como tal,
                            permite uma maior liberdade em implementação ao custo de uma certa perda em eficiência. Desvantagem
                            esta que, com o advento das últimas tecnologias incorporadas nos <a href="http://pt.wikipedia.org/wiki/Google_Chrome" target="_blank">navegadores mais recentes</a>, tem se
                            tornado cada vez menos relevante, tendo em vista que as <A href="http://en.wikipedia.org/wiki/V8_(JavaScript_engine)" target="_blank">novas máquinas virtuais JavaScript</a> aceleram
                            e otimizam código transformando-o em código de máquina nativo antes de sua execução.
                         </p>
                         <p>
                            Toda implementação foi feita utilizando-se <A href="http://pt.wikipedia.org/wiki/Orientação_a_objetos" target="_blank">Orientação a Objetos</a>, facilitando o desenvolvimento e ao mesmo
                            tempo fornecendo um exemplo de como aplicar esta t<span lang="pt-br">é</span>cnica na linguagem JavaScript.
                         </p>
                         </div>


			    <h2><a href="javascript:;" onMouseDown="toggleSlide('content-linguagem');">
                             Linguagem
                         </a></h2>
                         <div id="content-linguagem" style="display:none; overflow:hidden; height:100px;">
			    <p>
                            A linguagem ALG é uma linguagem hipotética com estrutura similar ao Pascal, procedural, sem muitos
                            recursos, porém com instruções suficientes para criação de algoritmos simples. A especificação da
                            linguagem através de uma <A href="http://pt.wikipedia.org/wiki/Gramática_livre_de_contexto" target="_blank">gramática livre de contexto</a> será disponibilizada em breve.
                         </p>
                         </div>

			             <h2><a href="javascript:;" onMouseDown="toggleSlide('content-analise-lexica');">
                             Análise Léxica
                         </a></h2>
                         <div id="content-analise-lexica" style="display:none; overflow:hidden; height:370px;">
			             <p>
                            O principal componente responsável por conduzir a <A href="http://pt.wikipedia.org/wiki/Análise_léxica" target="_blank">analise lexicográfica</a> é a classe <a href="source/Analise/AnalisadorLexico.js" target="_blank">AnaliseLexica.js</a>. A partir
                            de uma entrada em texto qualquer, esta classe é responsavel por identificar os tokens presentes nesta
                            entrada na ordem em que aparecem, utilizando seu método principal <b>getToken()</b>.
                         </p>
                         <p>
                            Cada <a href="source/Analise/Token.js" target="_blank">Token</a> consiste basicamente num par contendo um <a href="http://pt.wiktionary.org/wiki/semantema" target="_blank">lexema</a> (ou semantema) e a categoria do lexema
                            identificado, como, por exemplo, <b>(42,numero_inteiro)</b> ou <b>(myVar,identificador)</b>. Posteriormente, informações adicionais como a linha em que o lexema foi encontrado terão de ser adicionadas para as próximas análises.
                         </p>
                         <p>
                            A tabela de palavras reservadas é implementada na classe <a href="source/Analise/Keywords.js" target="_blank">Keywords</a>. Como internamente, todo objeto em
                            JavaScript é <a href="http://en.wikipedia.org/wiki/Associative_array" target="_blank">implementado como uma hashtable</a>, pudemos contar com este dinamismo
                            da linguagem como vantagem para implementar a tabela de palavras reservadas como um simples objeto e ainda assim obter a eficiência de busca desejada.
                         </p>
                         <p>
                            Mais informações sobre a <a href="http://pt.wikiversity.org/wiki/Introdução_à_Teoria_dos_Compiladores/Análise_Léxica" target="_blank">análise léxica</a> em compiladores podem ser encontradas na <a href="http://pt.wikiversity.org" target="_blank">Wikiversidade, a universidade livre</a>.
                            Clique no primeiro link para ir direto ao tópico.
                         </p>
                         </div>


                         <h2><a href="javascript:;" onMouseDown="toggleSlide('content-analise-sintatica');">
                             Análise Sintática
                         </a></h2>
                         <div id="content-analise-sintatica" style="display:none; overflow:hidden; height:520px;">
			             <p>
			                A classe responsável por conduzir a análise sintática é a classe <a href="source/Analise/AnalisadorSemantico.js" target="_blank">AnalisadorSintatico.js</a>.
			                A partir de uma entrada qualquer, esta classe instancia um analisador léxico e começa a utilizá-lo para identificar a sintaxe do texto, a partir das
			                regras sintáticas da linguagem ALG, implementadas a partir de gráfos sintáticos.
                         </p>
                         <p>
                            Uma das maiores dificuldades encontrada nesta fase é o tratamento de erros. A estratégia implementada
                            é o modo pânico, que consiste em não tentar corrigir o erro e tentar seguir a análise adiante apenas
                            relatando o erro encontrado.
                         <p>
                            A classe AnalisadorSintatico possui apenas um método principal, denominado parse(), que dá inicio à
                            análise sintática. Esse método faz chamadas ao método getToken() do analisador léxico, que retorna os
                            tokens identificados no programa. Após sua execução, eventuais erros encontrados estarão disponíveis
                            através do método errors(), que retorna a lista de erros detectados.
                         </p>
                         <p>
                            A cada ponto de erro é associado um conjunto de símbolos de sincronização que dirão ao parser onde
                            prosseguir a análise caso um erro seja encontrado. Com o andamento da análise sintática, marcas de
                            sincronização são passadas para as demais regras no momento de sua ativação. Ao se deparar com um erro,
                            o analisador varre a entrada, utilizando o método varre(), descartando simbolos até encontrar um dos
                            símbolos de sincronização, de onde então a análise poderá ser continuada.
                         </p>  
                         <p>
                            Para facilitar a programação do modo pânico, os procedimentos foram codificados de forma a evitar
                            estruturas condicionais aninhadas. Tal estratégia possibilita que a análise continue, na maioria das
                            vezes, por mais que vários erros sejam encontrados em cascata.
                         </p>
                         </div>

                         <h2><a href="javascript:;" onMouseDown="toggleSlide('content-analise-semantica');">
                             Análise Semântica
                         </a></h2>
                         <div id="content-analise-semantica" style="display:none; overflow:hidden; height:420px;">
			             <p>
			                A análise semântica é o terceiro passo na construção de um compilador, e é a última etapa de análise.
			             </p>
			             <p>
			                A classe <a href="source/Analise/AnalisadorSemantico.js" target="_blank">AnalisadorSemantico</a> é principal
			                responsável por realizar as operações de análise semântica sobre o código de entrada fornecido. Entretanto,
			                é a classe <a href="source/Analise/AnalisadorSintatico.js" target="_blank">AnalisadorSintatico</a> quem conduz
			                a análise semântica. Isso ocorre pois a semântica tem um forte acoplamento com a sintaxe – de fato, a semântica
			                é dirigida pela sintaxe. Portanto, a classe <b>AnalisadorSemantico</b> é implementada como uma propriedade
			                da classe <b>AnalisadorSintatico</b>.
			             </p>
			             <p>
			                O analisador semântico foi implementado como uma <a href="http://pt.wikipedia.org/wiki/M%C3%A1quina_de_estados_finitos" target="_blank">máquina de estados</a>, cuja representação pode ser vista
			                a seguir. Essa abordagem foi escolhida por facilitar o processamento semântico, que é sensível ao contexto,
			                e por fornecer um maior <a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos" target="_blank">desacoplamento e isolamento</a> na implementação. As principais operações implementadas
			                são inserção, verificação e remoção de <a href="source/Analise/Simbolo.js" target="_blank">símbolos</a> (variáveis ou procedimentos), mapeadas respectivamente nos
			                métodos inserir, verificar e remover.
			             </p>
			             <p>
			                Internamente, a classe AnalisadorSintatico utiliza a classe <a href="source/Analise/TabelaSimbolos.js"
			                target="_blank">TabelaSimbolos</a>, que é a tabela de símbolos em que são guardadas as informações sobre
			                as variáveis e procedimentos (<a href="source/Analise/Simbolo.js" target="_blank">Símbolos</a>) declarados.
			             </p>
			             </div>

                         <h2><a href="javascript:;" onMouseDown="toggleSlide('content-geracao-codigo');">
                             Geração de Código
                         </a></h2>
                         <div id="content-geracao-codigo" style="display:none; overflow:hidden; height:330px;">
			             <p>
			                Na produção de um compilador, subseqüente a fase de análise vêm as etapas de geração e otimização
			                de código intermediário e alvo, que aqui foram condensadas em uma única etapa de geração de código.
			             </p>
			             <p>
			                A geração de código alvo é implementada na classe <a href="source/Sintese/Gerador.js" target="_blank">Gerador</a>.
			                Assim como a análise semântica, a geração de código também é dirigida pela sintaxe. Logo, a classe Gerador é também
			                uma propriedade da classe <a href="source/Analise/AnalisadorSintatico.js" target="_blank">AnalisadorSintatico</a>.
			             </p>
                         <p>
                            Todavia, o gerador de código é mais simples que o analisador semântico e, por isso, não foi implantado
                            como uma máquina de estados. Sua estrutura é composta por diversos métodos sucintos que, conforme são
                            chamados, constroem instrução por instrução o programa no código alvo, que em nosso caso é 
                            <a href="http://en.wikipedia.org/wiki/ANSI_C" target="_blank">ANSI C</a>.
                            Os únicos métodos que têm funcionamento um pouco complexo são os relativos a listas de variáveis, que
                            precisam guardar nomes e tipos, já que as declarações de variáveis na linguagem ALG têm formato invertido
                            das declarações em linguagem C.
                         </p>
			             </div>
			             
                     </div>
                 </div>
              </form>
           <div style="clear: both;">&nbsp;</div>
	  </div>
      </div>
   </div>
   <div id="footer">
       <p>
           Copyright © 2009 <a href="http://crsouza.com" target="_blank">César Roberto de Souza</a>, <a href="http://www.comp.ufscar.br/~leotaba/" target="_blank">Leonardo Sameshima Taba</a>. Template originally designed by <a href="http://www.thewebhub.com" target="_blank">TheWebHub.com</a>.
       </p>
   </div>

  <script type="text/javascript">
     var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
     document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
  </script>
  <script type="text/javascript">
     try {
     var pageTracker = _gat._getTracker("UA-3114672-3");
     pageTracker._trackPageview();
     } catch(err) {}
  </script>
</body>
</html>
